package public_service

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"github.com/sirupsen/logrus"
	"os"
	"path"
	"strings"
	"study/server/global"
	"study/server/middleware"
	"study/server/utils/md5"
	"time"
)

func LoadFile(c *gin.Context) (msg string, dstPath string) {
	file, err := c.FormFile("file")
	if err != nil {
		return "请上传文件", ""
	}

	// 文件大小判断
	if file.Size > global.Config.UploadFile.MaxSize*1024*1024 {
		msg := fmt.Sprintf("文件大小不能超过%dMB", global.Config.UploadFile.MaxSize*1024*1024)
		return msg, ""
	}
	// 文件类型判断
	allowTypes := global.Config.UploadFile.AllowTypes
	var fileExt = map[string]bool{}
	for _, v := range allowTypes {
		fileExt[v] = true
	}

	ext := path.Ext(file.Filename) // 该方法返回文件名的扩展名
	if _, ok := fileExt[strings.ToLower(ext)]; !ok {
		return "文件类型错误,只支持" + strings.Join(allowTypes, " ") + "等类型", ""
	}

	authUser := middleware.GetTokenFromContext(c)
	dst := fmt.Sprintf("%s/%s/%s", global.Config.UploadFile.Path, authUser.Username, file.Filename)

	// 检查文件是否存在
	if _, err := os.Stat(dst); err == nil {
		// 文件存在则进行检查内容是否相同，内容相同则不进行存储，否则随机重命名新文件进行存储
		newFile, _ := file.Open()
		oldFile, _ := os.Open(dst)
		newFileMd5 := md5.FileToMd5(newFile)
		oldFileMd5 := md5.FileToMd5(oldFile)
		if newFileMd5 == oldFileMd5 {
			return "文件已存在,不可重复上传", ""
		} else {
			// 随机重命名新文件
			fileName := fmt.Sprintf("%s_%d%s", strings.TrimSuffix(file.Filename, ext), time.Now().Unix(), ext)
			dst = fmt.Sprintf("%s/%s/%s", global.Config.UploadFile.Path, authUser.Username, fileName)
		}
	}

	err = c.SaveUploadedFile(file, dst)
	if err != nil {
		logrus.Error("上传文件失败", err)
		return "文件上传失败", ""
	}
	return "", dst
}
